package org.xcolab.view.files;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.xcolab.client.files.FilesClient;
import org.xcolab.client.files.pojo.FileEntry;
import org.xcolab.view.util.entity.upload.FileUploadUtil;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@PropertySource({"file:${user.home}/.xcolab.application.properties"})
public class FileUploadController {
private static final int IMAGE_CROP_WIDTH_PIXELS = 300;
private static final int IMAGE_CROP_HEIGHT_PIXELS = 300;
private final String fileUploadPath;
@Autowired
public FileUploadController(Environment env) {
fileUploadPath = env.getProperty("files.upload.dir");
}
@PostMapping("/images/upload")
public ImageResponse singleFileUpload(@RequestParam("file") MultipartFile file,
HttpServletRequest request, HttpServletResponse response,
@RequestParam(required = false) Boolean resize) {
if(request.getParameter("resize") ==null){
resize = false;
}
return uploadImageResponse(file, request, resize);
}
private ImageResponse uploadImageResponse(MultipartFile file,
HttpServletRequest request, Boolean resize) {
try {
String path = request.getSession().getServletContext().getRealPath("/");
path = (fileUploadPath != null) ? (fileUploadPath) : (path);
byte[] bytes = file.getBytes();
if (resize!= null) {
bytes = FileUploadUtil
.resizeAndCropImage(ImageIO.read(new ByteArrayInputStream(bytes)),
IMAGE_CROP_WIDTH_PIXELS, IMAGE_CROP_HEIGHT_PIXELS);
}
FileEntry fileEntry = new FileEntry();
fileEntry.setCreateDate(new Timestamp(new Date().getTime()));
String nameExt = file.getOriginalFilename();
fileEntry.setFileEntryExtension((FilenameUtils.getExtension(nameExt)).toLowerCase());
fileEntry.setFileEntrySize(bytes.length);
fileEntry.setFileEntryName(FilenameUtils.getName(nameExt));
fileEntry = FilesClient.createFileEntry(fileEntry, bytes, path);
final String imageIdString = String.valueOf(fileEntry.getFileEntryId());
return new ImageResponse(imageIdString, fileEntry.getLinkUrl(), true, "");
} catch (IOException e) {
return new ImageResponse(null, null, false, e.getMessage());
}
}
@PostMapping("/images/uploadCkEditor")
public void singleCKEditorUpload(@RequestParam("upload") MultipartFile file,
HttpServletRequest request, HttpServletResponse response,
@RequestParam(required = false, name = "CKEditorFuncNum") String ckEditorFuncNum,
@RequestParam(required = false) Boolean resize) {
if(request.getParameter("resize") ==null){
resize = false;
}
ImageResponse ir = uploadImageResponse(file, request, resize);
try {
response.setContentType("text/html");
response.getOutputStream()
.write(("<script>window.parent.CKEDITOR.tools.callFunction(" + ckEditorFuncNum + ", \"" + ir.getImageUrl() + "\");</script>").getBytes());;
}catch (IOException ignored){
}
}
private static class ImageResponse {
private final String imageId;
private final String imageUrl;
private final boolean success;
private final String message;
private ImageResponse(String imageId, String imageUrl, boolean success, String message) {
this.imageId = imageId;
this.imageUrl = imageUrl;
this.success = success;
this.message = message;
}
public String getImageId() {
return imageId;
}
public String getImageUrl() {
return imageUrl;
}
public boolean isSuccess() {
return success;
}
public String getMessage() {
return message;
}
}
}